Android 8.0 Oreo 开发者常见问题 | Android 开发者 FAQ Vol.7
热情的开发者们都想尽快吃上 "Android Oreo",黑白分明的 Oreo 就像二进制代码一样,深深吸引着技术达人们。
自从一个月前我们发布了 Android Oreo 之后,收到了大量留言咨询,关注这个重要新版本特性的朋友们留下了许多有代表性的问题。
为了尽快让大家了解 Oreo 的特性,以及它与之前版本 Android 的区别,我们本月推出的《Android 开发者 FAQ》就为开发者们解答一些 “奥利奥” 的相关问题。
Q: 这些新特性是否提供向下兼容,如果提供,兼容到哪个版本?
A: 针对所有 API 级别的应用:
网络连接和 HTTP(S) 连接
集合的处理
记录未捕获的异常
输入和导航
安全性
后台执行限制
隐私性
针对 Android O 的应用:
内容变更通知
视图焦点
权限
集合的处理
媒体
类加载行为
Q: 关于 Android Oreo 有个问题想问一下:在该版本中,除了特定的系统隐式广播接收器,在其他系统广播接收器不能再以隐式进行注册。那么,自定义广播是否可以注册为隐式呢?
A: 自定义广播是可以注册为隐式的,如果应用注册为接收广播,则在每次发送广播时,应用的接收器都会消耗资源。 如果多个应用注册为接收基于系统事件的广播,这会引发问题;触发广播的系统事件会导致所有应用快速并连续消耗资源,从而降低用户体验。
Android 8.0 让这些限制更为严格
针对 Android 8.0 的应用无法继续在其清单中为隐式广播注册广播接收器。 隐式广播是一种不专门针对该应用的广播。 例如,ACTION_PACKAGE_REPLACED 就是一种隐式广播,因为它将发送到注册的所有侦听器,让后者知道设备上的某些软件包已被替换。
不过,ACTION_MY_PACKAGE_REPLACED 不是隐式广播,因为不管已为该广播注册侦听器的其他应用有多少,它都会只发送到软件包已被替换的应用。
应用可以继续在它们的清单中注册显式广播。
应用可以在运行时使用 Context.registerReceiver ( ) 为任意广播(不管是隐式还是显式)注册接收器。
需要签名权限的广播不受此限制所限,因为这些广播只会发送到使用相同证书签名的应用,而不是发送到设备上的所有应用。
在许多情况下,之前注册隐式广播的应用使用 JobScheduler 作业可以获得类似的功能。例如,一款社交照片应用可能需要不时地执行数据清理,并且倾向于在设备连接到充电器时执行此操作。
之前,应用已经在清单中为 ACTION_POWER_CONNECTED 注册了一个接收器;当应用接收到该广播时,它会检查清理是否必要。 为了迁移到 Android 8.0,应用将该接收器从其清单中移除。应用将清理作业安排在设备处于空闲状态和充电时运行。
Q: 如何设置我的 Android 8.0 Oreo 设备进行移动打印?
A: 随着 Android 8.0 Oreo 的发布,您无需设置即可在 Android 设备打印。现在已经内置移动打印。 您可以使用 Android 8.0 Oreo 设备上的默认打印服务进行核心打印功能,无需安装打印服务或下载移动打印应用程序
Q: Android Oreo 还有什么其他有趣的东西?
A:
▲ 智能文本选择
在支持它的应用程序中,您可以在任何地方轻按地址,URL,电话号码或电子邮件地址。Android 会识别文本的内容,并快速为您选择整个字符串,自己找出适当的开始和结束点,然后将为您提供一键选择,选择最合乎逻辑的位置(例如,带有号码的新电话或地址)。
▲ 更容易访问的本地文件管理器
Android Oreo 的文件管理器有一些新的选择,包括显示您的完整的内部存储的能力,并在应用程序内部打开本机文件管理器。它几乎与第三方文件管理器一样强大,它允许基本的浏览和文件操作 , 这对大多数人来说是足够使用的。
▲ 更智能的 Wi-Fi 切换
深深的沉浸在 Pixel 手机的网络设置菜单中,是 Android Oreo 最美味的选择之一:允许您的手机随时随地在已知的高质量网络范围内自动打开 Wi-Fi。而无需在第三方应用程序中进行复杂的配置来完成这种额外的选择。(此功能目前仅适用于 Pixel 手机。)
Q: Android O 的外观与我现在有什么不同吗?
A: Oreo 在 Android 美学方面并不是一个巨大的变化,但它确实引入了一些明显的调整和细化到核心用户界面。通知和快速设置面板可能是最明显的示例。它现在是一个更轻的色调,具有更多的信息和一些重新排列的元素。
通知本身也适用于 Oreo 的特定主题:例如,在 Google Play 音乐和 YouTube 的播放控制中,通知采用与当前播放的歌曲或视频的艺术品相匹配的漂亮配色方案。
Q: Android O 对于多语言和国家有什么新的调整吗?
A: Android 7.0(API 级别 24)引入能指定默认类别语言区域的概念,但是某些 API 在本应使用默认 DISPLAY 类别语言区域时,仍然使用不带参数的通用 Locale.getDefault ( ) 函数。
在 Android 8.0 中,以下函数使用 Locale.getDefault (Category.DISPLAY) 来代替 Locale.getDefault ( ):
Currency.getDisplayName ( )
Currency.getSymbol ( )
Locale.getDisplayScript ( )
当为 Locale 参数指定的 displayScript 值不可用时,Locale.getDisplayScript (Locale) 同样回退到 Locale.getDefault ( )。
与语言区域和国际化有关的其他变更如下:
调用 Currency.getDisplayName(null) 会引发 NullPointerException。
时区名称的分析方法发生变化。之前,Android 设备使用在启动时初始化的系统时钟值缓存用于分析日期时间的时区名称。因此,如果在启动时或其他较为罕见的情况下系统时钟出错,可能对分析产生负面影响。
现在,一般情况下,在分析时区名称时分析逻辑将使用 ICU 和当前系统时钟值。此项变更可提供更加准确的结果,如果您的应用使用 SimpleDateFormat 等类,此结果可能与之前的 Android 版本不同。
Android 8.0 将 ICU 的版本更新至版本 58
Q: 我最近在进行网页开发,Android O 对 WebView 有没有一些特别的修改?
A: Android 自动填充框架内置提供对自动填充功能的支持,对于安装到运行 Android 8.0 的设备上的应用,下列 WebView 对象相关的方法发生了变化:
WebSettings
getSaveFormData ( ) 函数现在返回 false。之前此函数返回为 true。
调用 setSaveFormData ( ) 不再有任何效果。
WebViewDatabase
调用 clearFormData ( ) 不再有任何效果。
hasFormData ( ) 函数现在返回 false。之前当表单包含数据时,此函数返回为 true。
Q: Android O 后台的位置限制影响哪些 API?
A: Fused Location Provider (FLP)
如果您的应用运行在后台,位置系统服务只会根据 Android 8.0 行为变更中定义的间隔,按每小时几次的频率为其计算新位置。即使您的应用请求进行更频繁的位置更新,也仍是如此。
如果您的应用运行在前台,与 Android 7.1.1(API 级别 25)相比,在位置采样率上不会有任何变化。
Geofencing
后台应用可以高于接收 Fused Location Provider 更新的频率接收地理围栏转换事件。
地理围栏事件的平均响应时间是大约每两分钟一次。
GNSS Measurements 和 GNSS Navigation Messages
当您的应用位于后台时,注册用于接收 GnssMeasurement 和 GnssNavigationMessage 输出的回调会停止执行。
Location Manager
提供给后台应用的位置更新只会根据 Android 8.0 行为变更中定义的间隔,按每小时几次的频率提供。
*注:如果运行您的应用的设备安装了 Google Play 服务,强烈建议您改用 Fused Location Provider (FLP)。
WLAN 管理器
startScan ( ) 方法对后台应用执行完整扫描的频率仅为每小时数次。如果不久之后后台应用再次调用此方法, WifiManager 类将提供上次扫描所缓存的结果。
Q: 这次 Android O 对联系人做了哪些改动?
A: 在之前版本的 Android 中,联系人提供程序组件允许开发者获取每个联系人的使用情况数据。此使用情况数据揭示了与某个联系人相关联的每个电子邮件地址和每个电话号码的信息,包括与该联系人联系的次数以及上次联系该联系人的时间。请求 READ_CONTACTS 权限的应用可以读取此数据。
如果应用请求 READ_CONTACTS 权限,它们仍可以读取此数据。从 Android 8.0 开始,使用情况数据查询会返回近似值,而不是精确值。不过,Android 系统内部仍然会保留精确值,因此,此变更不会影响 auto-complete API。
此行为变更会影响以下查询参数:
TIMES_CONTACTED
TIMES_USED
LAST_TIME_CONTACTED
LAST_TIME_USED
Q: 您好,我比较注重 Android O 的安全性,在账号安全方面 Android O 做了哪些改进?
A: 除非身份验证器拥有用户帐号或用户授予访问权限,否则,应用将无法再访问用户帐号。
仅拥有 GET_ACCOUNTS 权限尚不足以访问用户帐号,要获得帐号访问权限,应用应使用 AccountManager.newChooseAccountIntent ( ) 或特定于身份验证器的函数。获得帐号访问权限后,应用可以调用 AccountManager.getAccounts ( ) 来访问帐号。
Android 8.0 已弃用 LOGIN_ACCOUNTS_CHANGED_ACTION。现在,应用在运行时,应使用 addOnAccountsUpdatedListener ( ) 获取帐号更新信息。
以上便是我们对收集到的一些关于 Android Oreo 的高频问题及其解答,如果您有关于 Android 开发其他方面的问题,欢迎给我们留言,当某些领域的问题集中出现时,我们将集结整理成 FAQ 专栏文章,为开发者们答疑解惑。
推荐阅读:
全球数亿次总下载量,立足成都的Libii Game如何畅游海外市场?